package com.atguigu.spzx.manager.service.impl;

import com.atguigu.spzx.common.config.SpzxMinioConfig;
import com.atguigu.spzx.common.exception.SpzxException;
import com.atguigu.spzx.manager.service.FileService;
import com.atguigu.spzx.model.vo.common.ResultCodeEnum;
import com.atguigu.spzx.common.util.MinioUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {
    @Override
    public String upload(MultipartFile file, String module) {
        if(file.isEmpty()){
            throw new SpzxException(ResultCodeEnum.FILE_UPLOAD_ERROR,null);
        }
        try {

            MinioClient client = MinioUtils.build();
            //获取上传文件的真实名称
            String uploadFileName = file.getOriginalFilename();
            //获取上传文件的输入流
            InputStream fis = file.getInputStream();
            //问题： 上传时文件名如果相同 后上传的会覆盖先上传的  代码中可以生成唯一的文件名
            // 创建时间日期目录路径+ 唯一文件名 便于管理文件
            String path = module + new DateTime().toString("/yyyy-MM/dd/");
            String fileName = System.currentTimeMillis()+"_"+
                    UUID.randomUUID().toString().substring(0,6) +
                    uploadFileName.substring(uploadFileName.lastIndexOf("."));

            client.putObject(PutObjectArgs.builder()
                    .bucket(SpzxMinioConfig.BUCKET_NAME) //上传文件的桶
                    .object(path+fileName)//上传后 文件存入到桶内的相对路径+名称
                    // 参数1：上传文件的输入流 ， 参数2：上传文件的字节大小 ， 参数3：分片大小 -1不分片
                    .stream(  fis,fis.available() , -1)
                    .build());
            //http://192.168.1.170:9001/teacherimgs2/avatar/2023-10/10/1696902502135_62238e.jpg
            String imgPath = SpzxMinioConfig.ENDPOINT+"/"+SpzxMinioConfig.BUCKET_NAME+"/"+path+ fileName;
            return imgPath;
        } catch (Exception e) {
            throw new SpzxException( ResultCodeEnum.FILE_UPLOAD_ERROR,e);
        }
    }

    @Override
    public void remove(String path) {
        try {
            String filePath =  path.substring((SpzxMinioConfig.ENDPOINT+"/"+SpzxMinioConfig.BUCKET_NAME+"/").length());
            MinioUtils.build().removeObject(RemoveObjectArgs.builder()
                    .bucket(SpzxMinioConfig.BUCKET_NAME) //删除文件所在的桶
                    .object(filePath)//要删除的文件在桶内的相对路径
                    .build());
        } catch (Exception e) {
            throw new SpzxException(ResultCodeEnum.FILE_REMOVE_ERROR,e);
        }
    }
}
